Home

Row

Tweets Today

47

Tweeters Today

37

#rstats Likes

445249

#rstats Tweets

46269

Row

Tweet volume

Tweets by Hour of Day

Rankings

Row

Top Tweeters

User Engagement/Tweet
@v_matzek 2453.0
@kaymwilliamson 1864.0
@TheToadLady 1602.5
@kiramhoffman 1138.0
@adastephenson 1086.0
@hadleywickham 952.5
@drhammed 892.0
@LuukvanderMeer 778.0
@kimistry8 689.0
@kearneymw 599.4

Where Engagement is RT * 2 + Favourite

Network of top tweeters

Relationships in the graph describe replies and quote retweets from the top tweeters that also have the hashtag.

Row

Top Words

Word Count
datascience 21347
python 18162
100daysofcode 15380
machinelearning 14739
bigdata 13130
javascript 12816
analytics 12533
serverless 12531
iiot 11437
programming 11424

Row

Top Hashtags

Hashtag Count
#DataScience 17536
#Python 15727
#IoT 14409
#MachineLearning 13081
#AI 12371
#BigData 12077
#Serverless 11910
#Analytics 11821
#IIoT 11350
#Linux 10534

Excluding #rstats and similar variations

Common co-occuring hashtags

Hashtags that occur together, grouped by community detection

Data

Tweets in the current week

---
title: "#rstats Twitter Explorer"
output: 
  flexdashboard::flex_dashboard:
    orientation: rows
    vertical_layout: scroll
    source_code: embed
    theme:
      version: 4
      bootswatch: yeti
    css: styles/main.css
---

```{r load_package, include=FALSE}
devtools::load_all()
```

```{r setup, include=FALSE, cache=TRUE}
library(flexdashboard)
library(rtweet)
library(dplyr)
library(stringr)
library(tidytext)
library(lubridate)
library(echarts4r)
library(DT)

rstats_tweets <- read_twitter_csv("data/rstats_tweets.csv")

count_timeseries <- rstats_tweets %>%
  ts_data(by = "hours")

tweets_week <- rstats_tweets %>%
  filter(as_datetime(created_at) %within% interval(floor_date(today(), "week"), today()))

tweets_today <- rstats_tweets %>%
  filter(created_at == today())

by_hour <- rstats_tweets %>%
  group_by(hour = hour(created_at)) %>%
  summarise(count = n()) %>%
  ungroup()

number_of_unique_tweets <- get_unique_value(rstats_tweets, text)

number_of_unique_tweets_today <-
  get_unique_value(tweets_today, text)

number_of_tweeters_today <- get_unique_value(tweets_today, user_id)

number_of_likes <- rstats_tweets %>%
  pull(favorite_count) %>%
  sum()

top_tweeters <- rstats_tweets %>%
  group_by(user_id, screen_name, profile_url, profile_image_url) %>%
  summarize(engagement = (sum(retweet_count) * 2 + sum(favorite_count)) / n()) %>%
  ungroup() %>%
  slice_max(engagement, n = 10, with_ties = FALSE)

top_tweeters_format <- top_tweeters %>% 
  mutate(
    profile_url = stringr::str_glue("https://twitter.com/{screen_name}"),
    screen_name = stringr::str_glue('@{screen_name}'),
    engagement = formattable::color_bar("#a3c1e0", formattable::proportion)(engagement)
  ) %>%
  select(screen_name, engagement)

top_hashtags <- rstats_tweets %>%
  tidyr::separate_rows(hashtags, sep = " ") %>%
  count(hashtags) %>%
  filter(!(hashtags %in% c("rstats", "RStats"))) %>%
  slice_max(n, n = 10, with_ties = FALSE) %>%
  mutate(
    number = formattable::color_bar("plum", formattable::proportion)(n),
    hashtag = stringr::str_glue(
      '#{hashtags}'
    ),
  ) %>%
  select(hashtag, number)

word_banlist <-  c("t.co", "https", "rstats")
top_words <- rstats_tweets %>%
  select(text) %>%
  unnest_tokens(word, text) %>%
  anti_join(stop_words) %>%
  filter(!(word %in% word_banlist)) %>%
  filter(nchar(word) >= 4) %>% 
  count(word, sort = TRUE) %>%
  slice_max(n, n = 10, with_ties = FALSE) %>%     mutate(number = formattable::color_bar("peachpuff", formattable::proportion)(n)) %>%
  select(word, number)

top_co_hashtags <- rstats_tweets %>% 
  unnest_tokens(bigram, hashtags, token = "ngrams", n = 2) %>% 
  tidyr::separate(bigram, c("word1", "word2"), sep = " ") %>% 
  filter(!word1 %in% c(stop_words$word, word_banlist)) %>% 
  filter(!word2 %in% c(stop_words$word, word_banlist)) %>% 
  count(word1, word2, sort = TRUE) %>% 
  filter(!is.na(word1) & !is.na(word2)) %>% 
  slice_max(n, n = 100, with_ties = FALSE)
```


Home {data-icon="ion-home"}
====

Row
-----------------------------------------------------------------------

### Tweets Today

```{r tweets_today}
valueBox(number_of_unique_tweets_today, icon = "fa-comment-alt", color = "plum")
```

### Tweeters Today

```{r tweeters_today}
valueBox(number_of_tweeters_today, icon = "fa-user", color = "peachpuff")
```

### #rstats Likes

```{r likes}
valueBox(number_of_likes, icon = "fa-heart", color = "palevioletred")
```

### #rstats Tweets

```{r unique_tweets}
valueBox(number_of_unique_tweets, icon = "fa-comments", color = "mediumorchid")
```

Row {.tabset .tabset-fade}
-----------------------------------------------------------------------

### Tweet volume

```{r tweet_volume}
this_month <- floor_date(today(), "month")

count_timeseries %>%
  e_charts(time) %>%
  e_line(n, name = "# of tweets", smooth = TRUE, legend = FALSE) %>%
  e_x_axis(
    type = "time",
    formatter = htmlwidgets::JS(
      "function(value){
        let date = new Date(value);
        
        label = `${date.getDate()}-${(parseInt(date.getMonth()) + 1)}-${date.getFullYear()}`;
        return label;
      }"
    )
  ) %>%
  e_axis_labels(y = "Tweets") %>%
  e_theme("westeros") %>%
  e_tooltip(trigger = "axis", formatter = htmlwidgets::JS("
    function(params) {
      let date = new Date(params[0].value[0])
      let options = { year: 'numeric', month: 'short', day: 'numeric', hour: 'numeric'}
      let title = `${date.toLocaleDateString('en-US', options=options)}`
      let num = `${params[0].value[1]} tweets`
      return(`${title}
${num}`); }")) %>% e_datazoom(type = "slider") %>% e_zoom( dataZoomIndex = 0, start = 70, end = 100 ) %>% e_zoom( dataZoomIndex = 0, startValue = today() - 7, endValue = today(), btn = "weekBtn" ) %>% e_zoom( dataZoomIndex = 0, startValue = this_month, endValue = today(), btn = "monthBtn" ) %>% e_button( id = "weekBtn", position = "top", class = "btn btn-primary btn-sm", "This Week" ) %>% e_button( id = "monthBtn", position = "top", class = "btn btn-primary btn-sm", "This Month" ) ``` ### Tweets by Hour of Day ```{r tweets_by_hour} by_hour %>% e_charts(hour) %>% e_step(count, name = "Tweets", step = "middle", legend = FALSE) %>% e_x_axis( min = 0, max = 23, ) %>% e_axis_labels(x = "Time of Day (UTC)", y = "Tweets") %>% e_theme("westeros") %>% e_tooltip(trigger = "axis", formatter = htmlwidgets::JS(" function(params) { let title = `${params[0].value[0]}h` let num = `${params[0].value[1]} tweets` return(`${title}
${num}`); }")) ``` Row ----------------------------------------------------------------------- ### 💗 Most Liked Tweet Today {.tweet-box} ```{r most_liked} most_liked_url <- tweets_today %>% slice_max(favorite_count) get_tweet_embed(most_liked_url$screen_name, most_liked_url$status_id) ``` ### ✨ Most Retweeted Tweet Today {.tweet-box} ```{r most_rt} most_retweeted <- tweets_today %>% slice_max(retweet_count) get_tweet_embed(most_retweeted$screen_name, most_retweeted$status_id) ``` ### 🎉 Most Recent {.tweet-box} ```{r most_recent} most_recent <- tweets_today %>% slice_max(created_at, with_ties=FALSE) get_tweet_embed(most_recent$screen_name, most_recent$status_id) ``` Rankings {data-icon="ion-arrow-graph-up-right"} ========= Row ----------------------------------------------------------------------- ### Top Tweeters ```{r top_tweeters} top_tweeters_format %>% knitr::kable( format = "html", escape = FALSE, align = "cll", col.names = c("User", "Engagement/Tweet "), table.attr = 'class = "table"' ) ``` Where Engagement is `RT * 2 + Favourite` ### Network of top tweeters Relationships in the graph describe replies and quote retweets from the top tweeters that also have the hashtag. ```{r top_tweeters_net} edgelist <- network_data(rstats_tweets %>% unflatten(), "reply,quote") nodelist <- attr(edgelist, "idsn") %>% bind_cols() top_edges <- edgelist %>% filter((from %in% top_tweeters$user_id) | (to %in% top_tweeters$user_id)) top_nodes <- nodelist %>% filter((id %in% top_edges$from) | (id %in% top_edges$to)) %>% mutate(is_top = ifelse((id %in% top_tweeters$user_id), "yes", "no"), size = 10) e_charts() %>% e_graph() %>% e_graph_nodes(top_nodes, id, sn, size, category = is_top, legend = FALSE) %>% e_graph_edges(top_edges, from, to) %>% e_tooltip() ``` Row ----------------------------------------------------------------------- ### Top Words ```{r top_words} top_words %>% knitr::kable( format = "html", escape = FALSE, align = "cll", col.names = c("Word", "Count"), table.attr = 'class = "table"' ) ``` Row ----------------------------------------------------------------------- ### Top Hashtags ```{r top_hashtags} top_hashtags %>% knitr::kable( format = "html", escape = FALSE, align = "cll", col.names = c("Hashtag", "Count"), table.attr = 'class = "table"' ) ``` Excluding `#rstats` and similar variations ### Common co-occuring hashtags Hashtags that occur together, grouped by community detection ```{r co_hashtags} top_co_hash_nodes <- tibble( nodes = c(top_co_hashtags$word1, top_co_hashtags$word2) ) %>% distinct() e_chart() %>% e_graph() %>% e_graph_nodes(top_co_hash_nodes, nodes, nodes, nodes) %>% e_graph_edges(top_co_hashtags, word1, word2) %>% e_modularity() ``` Data {data-icon="ion-stats-bars"} ============== ### Tweets in the current week {.datatable-container} ```{r datatable} tweets_week %>% select( status_url, created_at, screen_name, text, retweet_count, favorite_count, mentions_screen_name ) %>% mutate( status_url = stringr::str_glue("On Twitter") ) %>% datatable( ., extensions = "Buttons", rownames = FALSE, escape = FALSE, colnames = c("Timestamp", "User", "Tweet", "RT", "Fav", "Mentioned"), filter = 'top', options = list( columnDefs = list(list( targets = 0, searchable = FALSE )), lengthMenu = c(5, 10, 25, 50, 100), pageLength = 10, scrollY = 600, scroller = TRUE, dom = '<"d-flex justify-content-between"lBf>rtip', buttons = list('copy', list( extend = 'collection', buttons = c('csv', 'excel'), text = 'Download' )) ) ) ```